// const qs = require("qs");

const express = require("express");
const app = express(); // 创建服务对象实例
const fs = require("fs"); // 操作文件
const router = express.Router();

// 该文件里的接口都是二级路由

const cname = "vue3_login_token"; // cookie名

// 全局中间件
app.use((request, response, next) => {
  // 只要该文件的接口被请求，就会打印如下日志
  console.log("用户服务器被请求了", request.url, request.method);
  next();
});

// 随机token
function randomStr() {
  var str = "";
  var dict = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-";
  for (var i = 0; i < 50; i++) {
    var index = Math.floor(Math.random() * dict.length);
    str += dict[index];
  }
  return str;
}

const filePath = "./interface/user/userRegisters.txt";

// 读取文件
/*
  返回数据有两种情况
    情况一：读取数据错误 返回字符串  "读取失败"
    情况2: 读取成功 又分为两哥请情况
        2.1 文件为空  返回 空字符串 '' 
        2.2 返回json字符串 类似 ==>  {"users":[{"username":"bonnie_123","password":"123456"}]}
*/
const readFile = () => {
  try {
    return fs.readFileSync(filePath, "utf8", { flag: "rs" });
  } catch (err) {
    return "读取失败";
  }
};

// 写文件  || 创建并写入
/*
  返回值有两个状态:
    success:   创建 | 写入成功
    error:     创建 | 写入失败
*/
const writeFile = (data) => {
  const writeContent = JSON.stringify({ users: data });
  console.log("写入文件，接收到的数据", data);
  console.log("写入文件，要写入的数据", writeContent);
  try {
    fs.writeFileSync(filePath, writeContent);
    return "success";
  } catch (error) {
    return "error";
  }
};

// 注册接口
router.post("/register", (request, response) => {
  console.log("注册");
  // 读取注册表信息
  const readData = readFile();

  // 定义默认返回值
  let res = { code: 404, msg: "注册失败，账号已存在" };

  // 接收到的数据
  var writeData = request.body;

  // undefined | ''  代表文件为空 没有数据
  // 读取失败 代表该文件不存在，需要进行创建并写入
  if (readData == "" || readData == undefined || readData == "读取失败") {
    console.log("1111");
    // 写入成功？  修改返回值
    if (writeFile([writeData]) == "success")
      res = { code: 200, msg: "success" };
  } else {
    console.log("2222");
    // 此种情况代表文件存在，且有数据
    const { users } = JSON.parse(readData);
    // const bool = users.some((item) => {
    //   const user = JSON.parse(item);
    //   return user.username == writeData.username;
    // });
    const bool = users.some((user) => user.username == writeData.username);
    console.log("bool: ", bool);
    if (bool) {
      res = { code: 404, msg: "注册失败，账号已存在" };
    } else {
      const newUsers = [...users, writeData];
      if (writeFile(newUsers) == "success") res = { code: 200, msg: "success" };
    }
  }

  response.send(res);
});

// 登录接口
router.get("/login", (request, response) => {
  // 解构接口参数
  const { username, password } = request.query;

  // 读取文件信息
  const result = readFile();

  // 定义默认返回值
  let res = { code: 402, msg: "登录失败,账号不存在 或 密码有误" };

  // 如果登录信息在注册表存在 则修改默认返回状态
  const token = randomStr();
  if (result !== "读取失败" && typeof users != "string") {
    const { users } = JSON.parse(result);
    const bool = users.some(
      (user) => user.username == username && user.password == password
    );
    if (bool) {
      res = { code: 200, msg: "success", token };
      response.cookie(
        // cookie名
        cname,
        //  cookie值
        token,

        {
          // 设置该Cookie只可以由服务端访问，即前端JavaScript无法访问document.cookie获取该值，但控制台还是可以查看和修改
          // httpOnly: true,
          // 只有通过HTTPS请求的Cookie才被使用，否则都认为是错误的Cookie
          // secure: true,
          // 设置保存Cookie的域名，浏览器查找Cookie时，子域名（如translate.google.com）可以访问主域名（google.com）下的Cookie，而主域名（google.com）不可以访问子域名（如translate.google.com）下的Cookie
          // 本地测试可直接设置为localhost
          domain: "localhost",
          // 设置保存Cookie的路径，浏览器查找Cookie时，子路径（如/map）可以访问根路径（'/'）下设置的Cookie，而根路径（'/'）无法访问子路径（如/map）下设置的Cookie
          path: "/",
          // 通过expires设置Cookie过期时间为14天后
          // expires: new Date(new Date().getTime() + 14 * 86400000),
          // 通过maxAge设置Cookie过期时间为14天后
          maxAge: 14 * 86400000,
        }
      );
    }
  }
  response.send(res);
  const cookies = request.headers.cookie.split(";");
  cookies.map((cookie) => {
    cookie_key = cookie.trim().split("=")[0];
    cookie_value = cookie.trim().split("=")[1];
    if (cookie_key === cname && cookie_value)
      console.log("状态已存在，无需登录");
  });
});

// 获取个人信息
router.get("/profile", (request, response) => {
  response.send({
    code: 200,
    data: {
      name: "bonnie_l",
      avatar:
        "https://img.chinasongzhuang.cn/uploadimg/image/20200219/20200219180104_83804.jpg ",
    },
  });
});

// 忘记密码
router.get("/forget", (request, response) => {
  const { email, password } = request.query;
  // 读取的数据
  const readData = readFile();
  const { users } = JSON.parse(readData);
  users.map((user) => {
    if (user.email == email) {
      user.password = password;
    }
  });

  const bool = writeFile(users);
  let res = {
    code: 403,
    msg: "修改密码失败",
  };
  if (bool == "success") {
    res = {
      code: 200,
      msg: "修改密码成功",
    };
  }
  response.send(res);
});

// 退出登录
router.get("/logout", (request, response) => {
  response.clearCookie(cname, { path: "/" });
  response.send({
    code: 200,
    msg: "退出成功",
  });
});

module.exports = router;
